package org.framework.common.ext.util.file;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.framework.common.ext.util.PropertiesUtil;
import org.springframework.web.multipart.MultipartFile;

/**
 * 文件操作.
 * <p>描述:</p>
 * <p>Company:上海中信信息发展股份有限公司</p>
 * @author chanlong(陈龙)
 * @date 2015年9月30日  下午8:36:31
 * @version 1.0.2015.
 */
public class FileUtil {

	public static final String FILE_EXTENSIONS_PDF = "pdf";
	public static final String FILE_EXTENSIONS_DOC = "doc";
	public static final String FILE_EXTENSIONS_XLS = "xls";
	public static final String FILE_EXTENSIONS_DOCX = "docx";
	public static final String FILE_EXTENSIONS_XLSX = "xlsx";
	
	public static final String UPLOAD_MODE_FILE = "file";
	public static final String UPLOAD_MODE_DATA = "data";
	
	private static int chunk = 0;
	private static int chunks = 1;
	
	private static byte[] filedata;
	
	public static String UPLOAD_URL;
	public static String UPLOAD_PATH;
	
	// 注册配置文件
	static { registConfig(); }
	
	/**
	 * 回调接口.
	 * <p>描述:</p>
	 * <p>Company:上海中信信息发展股份有限公司</p>
	 * @author chanlong(陈龙)
	 * @date 2015年10月2日  下午12:54:18
	 * @version 1.0.2015.
	 */
	public static interface Callback {
		public Object function(File file) throws Exception;
	}
	
	/**
	 * 文件上传状态
	 * <p>描述: </p>
	 * <p>Company: Professional</p>
	 * @author chanlong(陈龙)
	 * @date 2016年5月16日 下午11:18:30
	 * @version 1.0.2016
	 */
	public static class Result{
		public Boolean success;
		public String message;
		public String sourceUrl;
		public List<String> avatarUrls;
		
		public Result() {

		}
		
		public Result(Boolean success, String message, String sourceUrl, String... avatarUrls) {
			this.success = success;
			this.message = message;
			this.sourceUrl = sourceUrl;
			
			if(this.avatarUrls == null){
				this.avatarUrls = new ArrayList<>();
			}
			for (String avatarUrl : avatarUrls) {
				this.avatarUrls.add(avatarUrl);
			}
		}

		public Boolean getSuccess() {
			return success;
		}

		public void setSuccess(Boolean success) {
			this.success = success;
		}

		public String getMessage() {
			return message;
		}

		public void setMessage(String message) {
			this.message = message;
		}

		public String getSourceUrl() {
			return sourceUrl;
		}

		public void setSourceUrl(String sourceUrl) {
			this.sourceUrl = sourceUrl;
		}

		public List<String> getAvatarUrls() {
			return avatarUrls;
		}

		public void setAvatarUrls(List<String> avatarUrls) {
			this.avatarUrls = avatarUrls;
		}
		
	}
	
	/**
	 * 文件类型
	 * <p>描述: </p>
	 * <p>Company: Professional</p>
	 * @author chanlong(陈龙)
	 * @date 2016年3月12日 下午12:14:37
	 * @version 1.0.2016
	 */
	public static enum FileType {
		bmp, gif, jpg, png, tiff, pdf, doc, docx, xls, xlsx, ppt, pptx
	}
	
	/**
	 * 注册上下文环境.
	 * @param file 文件
	 * 
	 * @author chanlong(陈龙)
	 * @throws IOException 
	 * @date 2015年9月30日  下午8:45:37
	 */
	public static void registContext(final File file) throws IOException {
		FileUtil.filedata = FileUtils.readFileToByteArray(file);
	}
	
	/**
	 * 注册上下文环境.
	 * @param file
	 * @author chanlong(陈龙)
	 * @throws IOException 
	 * @date 2016年3月12日 下午12:16:06
	 */
	public static void registContext(final MultipartFile file) throws IOException {
		FileUtil.filedata = file.getBytes();
	}
	
	/**
	 * 注册上下文环境.
	 * @param file 要操作的文件
	 * @param chunk 分块索引
	 * @param chunks 分块数量
	 * 
	 * @author chanlong(陈龙)
	 * @throws IOException 
	 * @date 2015年9月30日  下午8:45:57
	 */
	public static void registContext(final File file, final int chunk, final int chunks) throws IOException{
		FileUtil.filedata = FileUtils.readFileToByteArray(file);
		FileUtil.chunk = chunk;
		FileUtil.chunks = chunks;
	}
	
	/**
	 * 保存文件到服务器.
	 * @param filename 包含路径的文件名称
	 * 
	 * @author chanlong(陈龙)
	 * @throws Exception 
	 * @date 2015年9月30日  下午8:47:15
	 */
	public static Object saveFile(final String filepath, final String filename, final Callback call) throws Exception {
		String fullname = new StringBuilder(filepath).append(filename).toString();
		
		File save = exists(new File(fullname));
		
		// 复制文件
		if(filedata != null){
			FileUtils.writeByteArrayToFile(save, filedata, true);
		}
		
		// 复制结束
		if (chunk == chunks - 1 && call != null) {
			return call.function(save);
		}else{
			return save;
		}
	}

	/**
	 * 判断文件是否存在，若存在则删除原文件，并重新生成.
	 * @param file
	 * @return
	 * @author chanlong(陈龙)
	 * @date 2015年10月5日  下午8:25:23
	 */
	public static File exists(final File file){
		String filename = file.getPath();
		if(chunk == 0 && file.exists()){
			file.delete();
			return new File(filename);
		}else{
			return file;
		}
	}
	
	/**
	 * 读取配置文件，获取文件上传路径.
	 * @param dbname
	 * @param group
	 * @return
	 * @author chanlong(陈龙)
	 * @date 2016年3月12日 下午12:08:38
	 */
	public static String getUploadPath(final String dbname, final String group) {
		String year = DateFormatUtils.format(new Date(), "yyyyMM");
		return new StringBuilder(UPLOAD_PATH).append(dbname).append("/").append(group).append("/").append(year).append("/").toString();
	}	
	
	private static void registConfig(){
		PropertiesUtil properties = PropertiesUtil.loader("/config/properties/config.properties");
		UPLOAD_URL = properties.getProperty("file.upload.url");
		UPLOAD_PATH = properties.getProperty("file.upload.path");
	}

	public static void main(String[] args) {
		System.out.println(FileType.valueOf("png"));
	}
}
